package com.yy.wga.pay.service.client;

import com.yy.wga.common.core.exception.BusinessException;
import com.yy.wga.pay.service.client.request.BaseOauthTokenRequest;
import com.yy.wga.pay.service.client.request.BasePreOrderRequest;
import com.yy.wga.pay.service.client.request.BaseQueryOrderRequest;
import com.yy.wga.pay.service.client.request.BaseQueryUserInfoRequest;
import com.yy.wga.pay.service.client.request.BaseRefundRequest;
import com.yy.wga.pay.service.client.request.BaseTransferRequest;
import com.yy.wga.pay.service.client.response.BaseOauthTokenResponse;
import com.yy.wga.pay.service.client.response.BasePreOrderResponse;
import com.yy.wga.pay.service.client.response.BaseQueryOrderResponse;
import com.yy.wga.pay.service.client.response.BaseQueryUserInfoResponse;
import com.yy.wga.pay.service.client.response.BaseRefundResponse;
import com.yy.wga.pay.service.client.response.BaseTransferResponse;

/**
 * @Author: gc
 * @Date: 2021/6/13
 * @Description: 第三方支付公共接口
 **/
public interface PayClient {
    /**
     * 获取渠道类型
     * @see EPayChannel
     * @return 渠道类型
     */
    Integer getType();
    /**
     * 创建预订单--app
     * @param request 请求参数
     * @param <T> 响应实体
     * @return 创建结果
     */
    default <T extends BasePreOrderResponse> T appPreOrder(BasePreOrderRequest<T> request) {
        throw new BusinessException("暂无实现过程");
    }
    /**
     * 创建预订单--h5网页
     * @param request 请求参数
     * @param <T> 响应实体
     * @return 创建结果
     */
    default <T extends BasePreOrderResponse> T h5PreOrder(BasePreOrderRequest<T> request) {
        throw new BusinessException("暂无实现过程");
    }

    /**
     * 创建预订单--js方式
     * @param request 请求参数
     * @param <T> 响应实体
     * @return 创建结果
     */
    default <T extends BasePreOrderResponse> T jsPreOrder(BasePreOrderRequest<T> request) {
        throw new BusinessException("暂无实现过程");
    }

    /**
     * 查询订单结果
     * @param request 请求参数
     * @param <T> 响应实体
     * @return 订单结果
     */
    default <T extends BaseQueryOrderResponse> T queryOrder(BaseQueryOrderRequest<T> request) {
        throw new BusinessException("暂无实现过程");
    }

    /**
     * 转账接口
     * @param request 请求参数实体
     * @param <T> 响应实体
     * @return 转账结果
     */
    default <T extends BaseTransferResponse> T transfer(BaseTransferRequest<T> request) {
        throw new BusinessException("暂无实现过程");
    }

    /**
     * 获取用户信息
     * @param request 请求参数实体
     * @param <T> 响应实体
     * @return 用户信息
     */
    default <T extends BaseQueryUserInfoResponse> T getUserInfo(BaseQueryUserInfoRequest<T> request) {
        throw new BusinessException("暂无实现过程");
    }

    /**
     * 获取授权访问令牌
     * @param request 请求参数实体
     * @param <T> 响应实体
     * @return 授权访问令牌
     */
    default <T extends BaseOauthTokenResponse> T oauthToken(BaseOauthTokenRequest<T> request) {
        throw new BusinessException("暂无实现过程");
    }

    default <T extends BaseRefundResponse> T refund(BaseRefundRequest<T> request) {
        throw new BusinessException("暂无实现过程");
    }
}
